home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / os2 / ext2_200.zip / EXT2_SRC.ZIP / 32BITS / EXT2-OS2 / FSD32 / FS32_DEL.C < prev    next >
C/C++ Source or Header  |  1996-09-21  |  5KB  |  151 lines

  1. //
  2. // $Header: D:/32bits/ext2-os2/fsd32/RCS/fs32_delete.c,v 1.1 1996/09/21 22:24:46 Willm Exp Willm $
  3. //
  4.  
  5. // 32 bits Linux ext2 file system driver for OS/2 WARP - Allows OS/2 to
  6. // access your Linux ext2fs partitions as normal drive letters.
  7. // Copyright (C) 1995, 1996 Matthieu WILLM
  8. //
  9. // This program is free software; you can redistribute it and/or modify
  10. // it under the terms of the GNU General Public License as published by
  11. // the Free Software Foundation; either version 2 of the License, or
  12. // (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. // GNU General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public License
  20. // along with this program; if not, write to the Free Software
  21. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22. #ifdef __IBMC__
  23. #pragma strings(readonly)
  24. #endif
  25.  
  26.  
  27. #define INCL_DOS
  28. #define INCL_DOSERRORS
  29. #define INCL_NOPMAPI
  30. #include <os2.h>
  31.  
  32. #include <string.h>
  33.  
  34. #include <os2/types.h>
  35. #include <os2/StackToFlat.h>
  36. #include <linux/fs.h>
  37. #include <os2/os2proto.h>
  38. #include <os2/fsd32.h>
  39. #include <os2/DevHlp32.h>
  40. #include <os2/log.h>
  41. #include <os2/trace.h>
  42. #include <os2/errors.h>
  43. #include <os2/files.h>
  44. #include <os2/volume.h>
  45. #include <linux/fs_proto.h>
  46. #include <linux/stat.h>
  47.  
  48. #define THISFILE FILE_TEST_C    // obsolete
  49. /*
  50.  * struct fs32_delete_parms {
  51.  *     unsigned short      iCurDirEnd;
  52.  *     PTR16               pFile;
  53.  *     PTR16               pcdfsd;
  54.  *     PTR16               pcdfsi;
  55.  * };
  56.  */
  57. int FS32ENTRY fs32_delete(struct fs32_delete_parms *parms) {
  58.     char           *pFile;
  59.     struct cdfsi32 *pcdfsi;
  60. //    union  cdfsd32 *pcdfsd;
  61.     int             rc;
  62.     struct super_block *sb;       /* volume descriptor */
  63.     struct inode       *dir;
  64.     struct file        *filp;
  65.     char                parent[CCHMAXPATH];
  66.     char                name[CCHMAXPATH];
  67.     char                *__name = __StackToFlat(name);
  68.     int                DOSmode;
  69.     umode_t                i_mode;
  70.  
  71.     parms = __StackToFlat(parms);
  72.  
  73.     if ((rc = DevHlp32_VirtToLin(parms->pcdfsi, __StackToFlat(&pcdfsi))) == NO_ERROR) {
  74. //        if ((rc = DevHlp32_VirtToLin(parms->pcdfsd, __StackToFlat(&pcdfsd))) == NO_ERROR) {
  75.             if ((rc = DevHlp32_VirtToLin(parms->pFile, __StackToFlat(&pFile))) == NO_ERROR) {
  76.     /*
  77.      * Trace
  78.      */
  79.     if (trace_FS_DELETE) {
  80.         kernel_printf("FS_DELETE(%s)", pFile);
  81.     }
  82.  
  83.     DOSmode = (is_case_retensive() ? OPENMODE_DOSBOX : 0);
  84.  
  85.     if (Read_Write) {
  86.  
  87.     //
  88.     // *** This is UGLY ... but it works !
  89.     //
  90.  
  91.  
  92.  
  93.         sb = getvolume(pcdfsi->cdi_hVPB);
  94.  
  95.         if ((filp = _open_by_name(sb, pFile, OPENMODE_READONLY | DOSmode)) == NULL) {
  96. #ifdef FS_TRACE
  97.             fs_err(FUNC_FS_DELETE, FUNC_OPEN_BY_NAME, -1, THISFILE, __LINE__);
  98. #endif
  99.             return ERROR_FILE_NOT_FOUND;
  100.         } /* end if */
  101.         i_mode = filp->f_inode->i_mode;
  102.         if ((rc = vfs_close(filp)) != NO_ERROR) {
  103.             fs_err(FUNC_FS_DELETE, FUNC_CLOSE, rc, THISFILE, __LINE__);
  104.             return -1;
  105.         }
  106.         if (!S_ISREG(i_mode)) {
  107. #ifdef FS_TRACE
  108.                 kernel_printf("FS_DELETE - %s is not a regular file", pFile);
  109. #endif
  110.             return ERROR_ACCESS_DENIED;
  111.         }
  112.         if ((!(i_mode & S_IWUSR)) &&
  113.             (!(i_mode & S_IWGRP)) &&
  114.             (!(i_mode & S_IWOTH))) {
  115. #ifdef FS_TRACE
  116.             kernel_printf("FS_DELETE - %s is read only", pFile);
  117. #endif
  118.             return ERROR_ACCESS_DENIED;
  119.         }
  120.  
  121.  
  122.         ExtractPath(pFile, __StackToFlat(parent));
  123.         ExtractName(pFile, __StackToFlat(name));
  124.         if ((filp = _open_by_name(sb, __StackToFlat(parent), OPENMODE_READONLY | DOSmode)) == NULL) {
  125. #ifdef FS_TRACE
  126.             fs_err(FUNC_FS_DELETE, FUNC_OPEN_BY_NAME, -1, THISFILE, __LINE__);
  127. #endif
  128.             return ERROR_PATH_NOT_FOUND;
  129.         } /* end if */
  130.         dir = filp->f_inode;
  131.         dir->i_count ++;
  132.         if ((rc = vfs_close(filp)) != NO_ERROR) {
  133.             fs_err(FUNC_FS_DELETE, FUNC_CLOSE, rc, THISFILE, __LINE__);
  134.             return -1;
  135.         }
  136.  
  137. //        dir = iget(sb, ino_no);
  138.         if ((rc = dir->i_op->unlink (dir, __StackToFlat(name), strlen(__name))) != NO_ERROR) {
  139.             kernel_printf("FS_DELETE(%s) : dir->i_op->unlink() - rc = %d", pFile, rc);
  140.         }
  141. //        iput(dir);
  142.         rc = map_err(rc);        // rc is a Linux error code (from linux/errno.h)
  143.     } else {
  144.         rc = ERROR_WRITE_PROTECT;
  145.     }
  146.             }
  147. //        }
  148.     }
  149.     return rc;
  150. }
  151.